home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 021-030 / amok25 / beeper / beeper.mod < prev    next >
Text File  |  1993-11-04  |  4KB  |  152 lines

  1. (*
  2.   :Program.       Beeper
  3.   :Author.        Philippe Gressly (Volker Rudolph)
  4.   :Address.       Näfenhaus CH 8926 Kappel a/A
  5.   :Phone.         
  6.   :ShortCut.      [Philu]
  7.   :Version.       1.0
  8.   :Date.          1.10.1989
  9.   :Copyright.     PD
  10.   :Language.      Modula-II
  11.   :Translator.    M2Amiga 3.2d
  12.   :Imports.       ExecSupport, Hardware, DOS;
  13.   :Contents.      Die Tasten melden sich akkustisch.
  14. *)
  15.  
  16.  
  17.  
  18. MODULE Beeper;
  19.               (* $S- *)
  20.  
  21.  
  22. FROM Arts        IMPORT TermProcedure, Assert, Terminate, CurrentLevel;
  23. FROM Exec        IMPORT OpenDevice, CloseDevice, DoIO, Forbid, Permit,
  24.                         AllocSignal, FreeSignal, Signal, FindTask, Wait,
  25.                         Interrupt, IOStdReqPtr, MsgPortPtr, TaskPtr,
  26.                         MemReqs, MemReqSet, AllocMem, FreeMem, Byte;
  27. FROM ExecSupport IMPORT CreatePort, CreateStdIO, DeletePort, DeleteStdIO;
  28. FROM Input       IMPORT inputName, addHandler, remHandler;
  29. FROM InputEvent  IMPORT InputEventPtr, Qualifiers, QualifierSet, Class;
  30. FROM SYSTEM      IMPORT ADR, ADDRESS, LONGSET, INLINE, REG, SETREG;
  31. FROM DOS IMPORT Delay;
  32. FROM Hardware IMPORT Custom, custom, DmaFlagSet, DmaFlags;
  33.  
  34.  
  35.  
  36. VAR handlerStuff:Interrupt;
  37.     inputPort:MsgPortPtr;
  38.     inputReq:IOStdReqPtr;
  39.     sigNum:LONGINT;
  40.     signal:LONGSET;
  41.     myTask:TaskPtr;
  42.     Ende: BOOLEAN; (* CTRL F10 pressed. Quit the program now. *)
  43.     Wave0 : POINTER TO ARRAY [0..1] OF Byte;
  44.     sig: LONGSET;
  45.  
  46.  
  47.   PROCEDURE InputHandler():InputEventPtr;
  48.   VAR
  49.     event:InputEventPtr;
  50.   BEGIN
  51.     event := ADDRESS(REG(8));  (* a0:InputEventPtr *)
  52.     Forbid;
  53.     WITH event^ DO
  54.      IF (class = rawkey) AND (code < 60H) THEN
  55.        Signal(myTask,signal)
  56.      END; (* IF *)
  57.      IF (class = rawkey) AND (code = 59H) AND (control IN qualifier) THEN
  58.         Ende := TRUE
  59.      END;
  60.     END; (* WITH *)
  61.     Permit;
  62.     RETURN event;
  63.   END InputHandler;
  64.  
  65.  
  66.  
  67.   (* $E- *)
  68.   PROCEDURE InputHandlerInterface;
  69.   BEGIN
  70.     INLINE(048E7H, 03F3EH);       (* movem.l  d2-d7/a2-a6,-(sp) *)
  71.     SETREG(0,InputHandler());     (* d0 : InputHandler()        *)
  72.     INLINE(04CDFH, 07CFCH);       (* movem.l  (sp)+,d2-d7/a2-a6 *)
  73.     INLINE(04E75H);               (* rts                        *)
  74.   END InputHandlerInterface;
  75.  
  76.  
  77.  
  78.  
  79.   PROCEDURE RemHandler;
  80.   BEGIN
  81.     IF inputReq # NIL THEN
  82.       WITH inputReq^ DO
  83.         IF device # NIL THEN
  84.           command := remHandler;
  85.           data := ADR(handlerStuff);
  86.           DoIO(inputReq);
  87.           CloseDevice(inputReq);
  88.         END; (* IF *)
  89.       END; (* WITH *)
  90.       DeleteStdIO(inputReq);
  91.       inputReq := NIL;
  92.     END; (* IF *)
  93.     IF inputPort # NIL THEN
  94.       DeletePort(inputPort);
  95.       inputPort := NIL;
  96.     END; (* IF *)
  97.     IF signal # LONGSET{} THEN
  98.       FreeSignal(sigNum);
  99.       signal := LONGSET{};
  100.     END; (* IF *)
  101.   END RemHandler;
  102.  
  103.  
  104.  
  105. BEGIN (* beeper main routine *)
  106.   Ende := FALSE;
  107.   myTask := FindTask(NIL);
  108.   TermProcedure(RemHandler);
  109.  
  110.   (* einfache Rechteckskurve *)
  111.   Wave0 := AllocMem(2, MemReqSet{chip});
  112.   Assert(Wave0 # NIL, ADR("No Chip Mem left"));
  113.   Wave0^[0] := 127; Wave0^[1] := -127;
  114.  
  115.   inputPort := CreatePort(ADR("BeepKey.port"),0);
  116.   inputReq := CreateStdIO(inputPort);
  117.   OpenDevice(ADR(inputName),0,inputReq,LONGSET{});
  118.   Assert(inputReq^.error = 0,ADR("AddHandler: Can't open input.device"));
  119.   WITH handlerStuff DO
  120.      code := InputHandlerInterface;
  121.      node.pri := 60;
  122.      node.name := ADR("BeepKey.handler");;
  123.   END; (* WITH *)
  124.   inputReq^.command := addHandler;
  125.   inputReq^.data := ADR(handlerStuff);
  126.   DoIO(inputReq);
  127.   Assert(inputReq^.error = 0,ADR("AddHandler: Can't add handler"));
  128.   sigNum := AllocSignal(-1);
  129.   Assert(sigNum # -1,ADR("AddHandler: Can't get signal"));
  130.   signal := LONGSET{sigNum};
  131.     
  132.     
  133.   REPEAT
  134.      sig := Wait(signal);
  135.  
  136.      (* Sound *)
  137.      custom.aud[1].acptr := Wave0;
  138.      custom.aud[1].aclen := 1;
  139.      custom.aud[1].acvol := 64;
  140.      custom.aud[1].acper := 650;
  141.      Forbid;
  142.      custom.dmacon := DmaFlagSet{dmaSet, master, aud1};
  143.      Delay(2);
  144.      custom.dmacon := DmaFlagSet{aud1};
  145.      Permit
  146.   UNTIL Ende;
  147.   RemHandler;
  148.   FreeMem(Wave0, 1);
  149.   custom.dmacon := DmaFlagSet{aud1}; (* Sound off in case... *)
  150.   Terminate(CurrentLevel())
  151. END Beeper.
  152.